#pragma once
#include"Common.hpp"

//这个类里面维护了一个跨度span双向链表，每一个span下面都挂了一个自由链表
//当ThreadCache中没有空间时，CentralCache负责将自己的内存交给上层的ThreadCache
//如果CentralCache当中没有空间时，则从下一层的PageCache当中获取空间
//其次，当ThreadCache下面的自由链表太长时，CentralCache负责回收ThreadCache自由链表当中的空间
class CentralCache
{
//在这个类当中我们使用单例模式,为了让ThreadCache能够访问到CentralCache内部定义的函数
public:
    //提供一个接口函数，供外部使用，后续都是通过这个接口函数访问类内成员
    static CentralCache*GetInstance()
    {
        return &_instance;
    }
    //根据需要的内存块大小，在自由链表中截取一段内存块，交给ThreadCache
    size_t AllocRangeMemory(void *&start, void *&end, size_t blockNum, size_t size);
    //寻找一个非空的Span
    Span*GetOneSpan(SpanList&list,size_t size);
    //回收ThreadCache交给Central的空间
    void RecycleThreadCacheMemory(void*start,size_t size);
private:
    //这里的Span跨度链表与上一层ThreadCache当中的映射规则相同，所以都是208个桶
    SpanList _spanlist[MAX_BUCKET];
    CentralCache(){}
    CentralCache(const CentralCache&)=delete;
    static CentralCache _instance; //static类型的成员，在类内申明，在类外定义
};

//对于Central而言，多个线程会同时访问这一层，为了解决线程并发访问的问腿，我们需要给这一层加上桶锁